using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace 文件管理器
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            // 初始化树形视图
            InitTreeView();
        }
        private void InitTreeView()
        {
            // 填写要查找的目录
            string root = @"D:\Study\";
            // 创建一个树节点，设置其文本为C盘，并添加到树形视图中
            TreeNode rootNode = new TreeNode(root);
            treeView1.Nodes.Add(rootNode);
            // 调用递归方法，为根节点添加子节点
            AddChildNodes(rootNode, root);
        }
        // 递归方法，为指定节点添加子节点
        private void AddChildNodes(TreeNode parentNode, string path)
        {
            try
            {
                // 获取指定路径下的所有子文件夹
                string[] subDirs = Directory.GetDirectories(path);
                //如果子文件夹为空，则递归结束，返回
                if (subDirs.Length == 0)
                {
                    return;
                }

                // 遍历每个子文件夹
                foreach (string subDir in subDirs)
                {
                    // 获取子文件夹的名称
                    string name = Path.GetFileName(subDir);
                    // 创建一个树节点，设置其文本为子文件夹的名称，并添加到父节点中
                    TreeNode childNode = new TreeNode(name);
                    parentNode.Nodes.Add(childNode);
                    // 递归调用，为子节点添加孙节点
                    AddChildNodes(childNode, subDir);
                }
            }
            catch (Exception ex)
            {
                // 忽略异常，如无访问权限等
                MessageBox.Show(ex.Message);
            }
        }
        // 树形视图的选择事件处理方法
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            // 获取当前选择的节点
            TreeNode selectedNode = e.Node;
            // 获取当前选择的节点对应的路径
            string path = GetPath(selectedNode);
            // 调用方法，显示该路径下的子文件夹和文件
            ShowFilesAndFolders(path);
        }
        // 获取指定节点对应的路径
        private string GetPath(TreeNode node)
        {
            // 如果节点是根节点，直接返回其文本
            if (node.Parent == null)
                return node.Text;
            // 否则，递归获取父节点的路径，并拼接当前节点的文本
            else
                return Path.Combine(GetPath(node.Parent), node.Text);
        }
        // 显示指定路径下的子文件夹和文件
        private void ShowFilesAndFolders(string path)
        {
            try
            {
                // 清空列表视图中的所有项和列
                listView1.Items.Clear();
                listView1.Columns.Clear();
                // 添加两个列，分别显示名称和类型
                listView1.Columns.Add("名称", 200);
                listView1.Columns.Add("类型", 100);
                // 获取指定路径下的所有子文件夹和文件，并按名称排序
                string[] subDirs = Directory.GetDirectories(path);
                string[] files = Directory.GetFiles(path);
                Array.Sort(subDirs);
                Array.Sort(files);
                // 遍历每个子文件夹，创建列表项并添加到列表视图中
                foreach (string subDir in subDirs)
                {
                    string name = Path.GetFileName(subDir); // 获取子文件夹的名称
                    ListViewItem item = new ListViewItem(name); // 创建列表项，设置其文本为名称
                    item.SubItems.Add("文件夹"); // 添加子项，设置其文本为类型
                    item.ImageIndex = 0; // 设置列表项的图标索引为0（文件夹图标）
                    listView1.Items.Add(item); // 将列表项添加到列表视图中
                }
                // 遍历每个文件，创建列表项并添加到列表视图中
                foreach (string file in files)
                {
                    string name = Path.GetFileName(file); // 获取文件的名称
                    string ext = Path.GetExtension(file); // 获取文件的扩展名
                    ListViewItem item = new ListViewItem(name); // 创建列表项，设置其文本为名称
                    item.SubItems.Add(ext); // 添加子项，设置其文本为类型
                    item.ImageIndex = 1; // 设置列表项的图标索引为1（文件图标）
                    listView1.Items.Add(item); // 将列表项添加到列表视图中
                }
            }
            catch (Exception ex)
            {
                // 忽略异常，如无访问权限等
                MessageBox.Show(ex.Message);
            }
        }
        // 列表视图的双击事件处理方法
        private void listView1_DoubleClick(object sender, EventArgs e)
        {
            // 获取当前选择的列表项
            ListViewItem selectedItem = listView1.SelectedItems[0];
            // 获取列表项的文本（名称）
            string name = selectedItem.Text;
            // 获取列表项的子项的文本（类型）
            string type = selectedItem.SubItems[1].Text;
            // 如果类型是文件夹，那么在树形视图中选择对应的节点
            if (type == "文件夹")
            {
                // 获取当前选择的树节点
                TreeNode selectedNode = treeView1.SelectedNode;
                // 在其子节点中查找与列表项文本相同的节点
                TreeNode childNode = selectedNode.Nodes[name];
                // 如果找到了，那么选择该节点
                if (childNode != null) 
                { 
                    treeView1.SelectedNode = childNode;
                    MessageBox.Show("选择的是文件夹");
                }
                /*string folderPath = @"C:\Users\Admin\Documents"; // 文件夹路径
                Process.Start("explorer.exe", folderPath); // 启动资源管理器并打开文件夹*/
            }
            // 如果类型是.exe文件，那么尝试运行该文件
            else if (type == ".exe")
            {
                // 获取当前选择的树节点对应的路径
                string path = GetPath(treeView1.SelectedNode);
                // 拼接文件的完整路径
                string fullPath = Path.Combine(path, name);
                try
                {
                    // 尝试运行该文件
                    System.Diagnostics.Process.Start(fullPath);
                }
                catch (Exception ex)
                {
                    // 弹出消息框，显示异常信息
                    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            // 如果类型是.txt文件，那么尝试用记事本打开该文件
            else if (type == ".txt")
            {
                // 获取当前选择的树节点对应的路径
                string path = GetPath(treeView1.SelectedNode);
                // 拼接文件的完整路径
                string fullPath = Path.Combine(path, name);
                try
                {
                    // 尝试用记事本打开该文件
                    System.Diagnostics.Process.Start("notepad.exe", fullPath);
                }
                catch (Exception ex)
                {
                    // 弹出消息框，显示异常信息
                    MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
    }
}
